package com.cskaoyan.javase.object._7wrapper._1basic;

/**
 * 包装类型自身对象特点
 * 所有的包装类型都可以创建对象,除了Void
 *
 * 所有的包装类型对象,都是不可变对象.
 * 何为不可变对象呢?
 * 所谓的不可变对象,指的是对象一旦创建出来,除非销毁它,否者对象的状态不可改变.
 * 当然对象的状态不可改指的是:
 *      1.对象中的基本数据类型成员变量的取值不可变。
 *      2.对象中的引用数据类型成员变量状态不可变：
 *          a.该引用不能指向新的对象。
 *          b.该引用指向的对象状态也不可变。
 *
 * Java当中的不可变对象太多了，其中最典型的就是：
 *      1.String字符串对象
 *      2.数值类型包装类型对象以及Boolean对象
 * 但是这两种类型对象，实现不可变的原理虽然大体相同，但略有差异。
 *
 * @since 09:44
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        // "abc"对象在堆上被创建出来,就永远不可变了,除非被销毁了
        String str = "abc";
        // 但是对象不可变,不是引用不可变,引用str可以指向新的字符串对象
        str = "123";

        String s = "777";
        test(s);
        System.out.println(s);

        Student s2 = new Student();
        System.out.println(s2.age);
        test2(s2);
        System.out.println(s2.age);
    }

    public static void test(String s) {
        // 因为String对象不可变,一旦想要修改字符串内容,其实是指向了新对象
        // 所以这里是拷贝的引用指向了新对象,但是原先的引用不受影响
        s = "666";
    }
    public static void test2(Student s){
        // s也是原先引用的拷贝,但是s对象是可变的,所以能够修改原先对象的中age的取值
        s.age = 18;
    }
}
class Student{
    int age = 28;
}
